package club.emergency.wechat.redis;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Create with IntelliJ IDEA
 * Project Name: business
 * Package Name: club.emergency.wechat_api.redis
 * Date: 2018/11/15
 *
 * @author: 快乐的小菌菌
 * Description: redis日常操作工具类，采用StringRedisTemplate作为redis的操作主类，一切返回value都是以字符串形式返回
 */
public interface RedisOperation<T> {
    /**
     * 常规添加一对键值
     *
     * @param key   键
     * @param value 值
     */
    void add(String key, T value);

    /**
     * 添加一对键值，并设置过期时间
     *
     * @param key      键
     * @param value    值
     * @param time     时常
     * @param timeUnit 时常单位
     */
    void add(String key, T value, long time, TimeUnit timeUnit);

    /**
     * 添加一对键值，并设置过期时间为6小时
     *
     * @param key   键
     * @param value 值
     */
    void addExpire(String key, T value);

    /**
     * 根据key获取value
     *
     * @param key   key
     * @param clazz 泛型对象
     * @return value对象
     */
    T get(String key, Class<T> clazz);

    /**
     * 根据key获取value
     *
     * @param key          key
     * @param elementClass 元素泛型对象
     * @return value对象
     */
    List<T> getList(String key, Class<T> elementClass);

    /**
     * 判断是否有传入的key存在
     *
     * @param key 键
     * @return boolean
     */
    Boolean hasKey(String key);

    /**
     * 删除键值
     *
     * @param key
     */
    void delete(String key);

    /**
     * 构造key
     *
     * @param strings 需要添加的参数
     * @return string
     */
    String keysConvert(String... strings);

    /**
     * 模糊获取key
     *
     * @param key key
     * @return list
     */
    List<String> getKeys(String key);

    /**
     * 新增有序set
     *
     * @param key   key
     * @param value value
     * @param score 分数（排序）
     */
    void zAdd(String key, String value, Double score);

    /**
     * 模糊key查询
     *
     * @param key key
     * @return keyList
     */
    List<String> likeKeys(String key);

    /**
     * 批量删除
     *
     * @param keyList ids
     */
    void deleteKeyList(List<String> keyList);
}
